// 导入db模块
const db = require('../db/index')
// 导入multiparty中间件来解析图片文件
const multiparty = require('multiparty')
// 导入dayjs
const dayjs = require('dayjs')

// 通过uuId查询个人中心 
/* 
问题:我们没有建立关系型数据库,所以在注册用户后并没有在个人资料表中插入数据,
解决:第一次查询看有没有，没有则插入，使用二次查询解决
*/
// 通过id获取个人信息函数
exports.getUserinfo = (req, res) => {
  // 定义查询语句
  const sql = 'select * from wall_personal where uuId=?'
  db.query(sql, req.user.id, (err, result) => {
    // 查询失败
    if (err) return res.cc(err)
    // 查询成功但查询到的数据条数不等于1
    if (result.length !== 1) {
      let data = {}
      data.uuId = req.user.id
      // 说明数据库还没有该id的信息  需要我们插入  定义插入语句
      const insertSql = 'insert into wall_personal set?'
      db.query(insertSql, data, (err, result) => {
        // 插入失败
        if (err) return res.cc(err)
        // 影响行数不等于1
        if (result.affectedRows !== 1) return res.cc('添加个人资料失败,请稍后重试')
        // 影响行数等于1,二次查找返回结果
        const selectSql = 'select * from wall_personal where uuId=?'
        db.query(selectSql, req.user.id, (err, result) => {
          // 查询失败
          if (err) return res.cc(err)
          // 查询成功但查询到的数据条数不等于1
          if (result.length !== 1) return res.cc('查询失败,请稍后重试')
          res.send({
            code: 200,
            message: '插入且查询成功',
            data: result[0]
          })
        })
      })
    }
    // 查询到结果
    if (result.length === 1) {
      res.send({
        code: 200,
        message: '查询成功',
        data: result[0]
      })
    }
  })
}
// 保存个人信息函数
exports.saveUserinfo = (req, res) => {
  // 定义查询语句 第一次查询昵称是否被占用且排除自己
  const sql = 'select * from wall_personal where nickname=? and uuId!=?'
  db.query(sql, [req.body.nickname, req.user.id], (err, result) => {
    if (err) return res.cc(err)  //查询失败
    if (result.length > 0) return res.cc('用户名被占用,再想个酷点的吧')
    // 定义更新语句
    const updateSql = 'update wall_personal set? where uuId=?'
    db.query(updateSql, [req.body, req.user.id], (err, result) => {
      if (err) return res.cc(err) //更改失败
      // 影响行数不等于1
      if (result.affectedRows !== 1) return res.cc('保存失败,请稍后重试')
      res.send({
        code: 200,
        message: '保存成功',
      })
    })
  })
}
// 更新用户头像
exports.updateAvatar = (req, res) => {
  // 在这之前，我们应该先查询用户更改头像时间，（每小时上传一次）
  // SELECT * FROM 表名 WHERE 字段名>NOW()-INTERVAL 1 HOUR; 查询一个小时之内的数据
  const selectSql = 'select * from wall_personal where uuId=? and updatetime >NOW()-INTERVAL 1 HOUR'
  db.query(selectSql, req.user.id, (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 0) { //说明用户一个小时内没有修改
      let form = new multiparty.Form();
      form.uploadDir = 'public/images'
      form.parse(req, (err, fields, files) => {
        // err:错误信息 fields:上传的数据信息 files:上传的文件信息
        if (err || Object.keys(files).length === 0) res.cc('更改头像失败，请稍后重试')
        // 注意:这里如果不加 http:// 服务器就会自动在url地址前面加一个http://locahost:8080 
        let serveUrl = 'http://127.0.0.1:8889' //声明一个服务器地址
        let url = serveUrl + files.file[0].path.replace(/\\/g, '/').replace(RegExp('public'), '') //这个是对图片地址格式做一个格式修改
        // 图片上传完成后，应该把地址存放到数据库 定义sql语句
        // 我们需要获取一下时间
        let data = { user_pic: url, updatetime: dayjs().format("YYYY-MM-DD HH:mm:ss") }
        const sql = 'update wall_personal set? where uuId=?'
        db.query(sql, [data, req.user.id], (err, result) => {
          // 执行语句失败
          if (err) return res.cc(err)
          // 更新失败  更改数据看影响,查看数据看长度
          if (result.affectedRows !== 1) return res.cc('更新失败,请稍后重试')
          res.send({ code: 200, message: '更新头像成功', data: url })
        })
      })
    } else {
      res.cc('一个小时内已经更新过头像了哦，稍等一会吧')
    }
  })
}
// 通过id获取用户头像
exports.getAvatarByid = (req, res) => {
  // 定义查询语句 第一是否有这个用户，第二是否更改过值
  const sql = 'select * from wall_personal where uuId=?'
  db.query(sql, req.user.id, (err, result) => {
    // 查询失败
    if (err) return res.cc(err)
    // 查询成功但查询到的数据条数不等于1
    if (result.length !== 1) return res.cc('尚未打开过我的信息')
    res.send({
      code: 200,
      message: '查询成功',
      data: result[0].user_pic
    })
  })
}
// 通过id签到
exports.signInByid = (req, res) => {
  // 逻辑：我们应该先查询用户今天是否点击了签到
  // 查询当天的所有数据  SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=0
  // 定义查询语句
  // dayjs(timer).format("YYYY-MM-DD HH:mm:ss")
  const selectSql = 'SELECT * FROM wall_users WHERE id=? and DATEDIFF(log_timer, NOW()) = 0'
  db.query(selectSql, req.user.id, (err, result) => {
    if (err) return res.cc(err)
    // 判断能不能查询到结果
    if (result.length > 1) return res.cc('签到失败，请稍后重试')
    if (result.length === 1) return res.cc('今天已经签到过了哦，记得明天也要签到哦')
    if (result.length === 0) {
      // 定义更改语句  用户签到，正常插入数据
      // 获取当前时间
      let timer = dayjs().format("YYYY-MM-DD HH:mm:ss")
      // 定义插入语句
      const sql = 'update wall_users set log_timer=? where id=?'
      db.query(sql, [timer, req.user.id], (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc('签到失败,请稍后重试')
        res.send({
          code: 200,
          message: '签到成功'
        })
      })
    }
  })
}
// 获取我的关系处理函数
exports.getrealtion = (req, res) => {
  // 定义查询语句 uuId查询自己主动 hhId查询自己被动 这里查询的id都一样只是有主动和被动两种情况
  const sql = 'select * from wall_relation where uuId=? or hhId=?'
  db.query(sql, [req.user.id, req.user.id], (err, result) => {
    if (err) return res.cc(err)
    // 问题；我们拿到数据是不知道自己是主动还是被动，需要服务器在这里把自己的id也返回获取
    result.forEach(item => {
      item.userId = req.user.id
    })
    res.send({
      code: 200,
      message: '查询成功',
      data: result
    })
  })
}
// 访问个人信息，访问用户处理函数
exports.visitUserinfo = (req, res) => {
  // 定义查询语句
  const sql = 'select * from wall_personal where uuId=?'
  db.query(sql, req.params.uuId, (err, result) => {
    if (err) return res.cc(err)
    if (result.length !== 1) return res.cc('获取用户信息失败')
    res.send({
      code: 200,
      message: '插入且查询成功',
      data: result[0]
    })
  })
}
// 访问我的关系处理函数
exports.visitrealtion = (req, res) => {
  // 定义查询语句 uuId查询自己主动 hhId查询自己被动 这里查询的id都一样只是有主动和被动两种情况
  const sql = 'select * from wall_relation where uuId=? or hhId=?'
  db.query(sql, [req.params.uuId, req.params.uuId], (err, result) => {
    if (err) return res.cc(err)
    // 问题；我们拿到数据是不知道自己是主动还是被动，需要服务器在这里把自己的id也返回获取
    result.forEach(item => {
      item.userId = req.params.uuId
    })
    res.send({
      code: 200,
      message: '查询成功',
      data: result
    })
  })
}
// 我的消息提示数处理函数
exports.gethintcount = (req, res) => {
  // 定义查询语句
  const sql = 'select count(*) as count from wall_walls where inform=?'
  db.query(sql, req.user.id, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      code: 200,
      message: '查询成功',
      data: result[0]
    })
  })
}
// 获取我的消息数据处理函数
exports.getinfromData = (req, res) => {
  // 定义降序查询我的通知消息 展示不去滚动加载，因为后面可能加入更多的通知元素
  const sql = 'select * from wall_walls where inform=? order by timer desc'
  db.query(sql, req.user.id, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      code: 200,
      message: '查询成功',
      data: result
    })
  })
}